home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Magnum One
/
Magnum One (Mid-American Digital) (Disc Manufacturing).iso
/
d12
/
cxl52_1.arc
/
CXLDEMO.C
< prev
next >
Wrap
C/C++ Source or Header
|
1990-02-19
|
47KB
|
1,448 lines
/* ┌┬───────────────────────────────────────────────────────────────────┬┐
││ ││
││ CXL Demonstration Program ││
││ ││
││ CXL is Copyright (c) 1987-1990 by Mike Smedley ││
││ ││
││ Syntax: CXLDEMO [-switches] ││
││ ││
││ -c = CGA snow elimination ││
││ -b = BIOS screen writing ││
││ -m = force monochrome text attributes ││
││ ││
││ Compiler command lines: ││
││ ││
││ MSC: cl -Ox cxldemo.c cxlmss.lib ││
││ QC: qcl -Ox cxldemo.c cxlmss.lib ││
││ TC: tcc -Z -O cxldemo.c cxltcs.lib ││
││ ZTC: ztc -msi -o -b cxldemo.c cxlzts.lib ││
││ ││
└┴───────────────────────────────────────────────────────────────────┴┘ */
/*---------------------------------------------------------------------------*/
/* header files */
#include <conio.h>
#include <ctype.h>
#include <dos.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "cxldef.h"
#include "cxlkey.h"
#include "cxlmou.h"
#include "cxlstr.h"
#include "cxlvid.h"
#include "cxlwin.h"
#if defined(__TURBOC__) /* Turbo C */
#include <dir.h>
#else
#include <direct.h> /* all others */
#endif
#if defined(M_I86) && !defined(__ZTC__) /* MSC/QuickC */
#define bioskey(a) _bios_keybrd(a)
#define findfirst(a,b,c) _dos_findfirst(a,c,b)
#define findnext(a) _dos_findnext(a)
#define ffblk find_t
#define ff_name name
#elif defined(__ZTC__) /* Zortech C/C++ */
#define ffblk FIND
#define ff_name name
#define ff_attrib attribute
#endif
/*---------------------------------------------------------------------------*/
/* function prototypes */
static void activate_demo (void);
static void add_shadow (void);
static void chg_attr_demo (void);
static void chg_bord_demo (void);
static void chg_wind_attr (int battr,int wattr);
static int check_date (char *buf);
static void close_windows (void);
static void confirm_quit (void);
static void copy_demo (void);
static void cxlinfo (void);
static void datademo (void);
static void directory (void);
static void display_date (void);
static void disp_sure_msg (void);
static void display_title (int tpos);
static void do_nothing (void);
static void error_exit (int errnum);
static void execute (void);
static int find_first (char *filespec,struct ffblk *ffblk);
static int find_next (struct ffblk *ffblk);
static unsigned get_key (int *done);
static void hide_demo (void);
static void horz_line (int wrow,int wcol,int count,int attr);
static void initialize (void);
static void line_inp_demo (void);
static void main_menu (void);
static void menudemo (void);
static void move_bar_down (void);
static void move_demo (void);
static void move_window (int nsrow,int nscol);
static void normal_exit (void);
static void open_back_wind(void);
static void open_stat_wind(void);
static void open_titl_wind(void);
static void os_shell (void);
static void parse_cmd_line(int argc,char *argv[]);
static void parse_date (char *buf,int *month,int *day,int *year);
static void pick_compiler (void);
static void pickdemo (void);
static void popup_demo (void);
static void pre_help (void);
static void pre_menu1 (void);
static void pre_menu2 (void);
static void pre_pick1 (void);
static void press_a_key (int wrow);
static void pulldown_demo (void);
static void quit_window (void);
static void resize_demo (void);
static void restore_cursor(void);
static void r_margin (void);
static void scroll_demo (void);
static void setup_menu (void);
static void short_delay (void);
static void size_window (int nerow,int necol);
static void text_line_demo(void);
static void title_demo (void);
static void toggle_block (void);
static void toggle_yn (void);
static void update_clock (void);
static void vert_line (int wrow,int wcol,int count,int attr);
static void you_selected (char *str);
static void windemo (void);
/*---------------------------------------------------------------------------*/
/* miscellaneous global variables */
static int *savescrn,crow,ccol;
static WINDOW w[10];
/*---------------------------------------------------------------------------*/
/* fields used in data entry demo */
static char date[7],firstname[16],initial[2],lastname[26],address[41],city[21],
state[3],zipcode[10],phone[11],compiler[16],amtenc[8],comments[41],
ssan[10];
/*---------------------------------------------------------------------------*/
/* months table */
static char *months[]= {
"January","February","March","April","May","June","July","August",
"September","October","November","December",NULL
};
/* printer ports table */
static char *prn_ports[]= { "PRN","LPT1","LPT2","COM1","COM2",NULL };
/* error message table */
static char *error_text[]= {
NULL, /* errnum = 0, no error */
NULL, /* errnum == 1, windowing error */
"Syntax: CXLDEMO [-switches]\n\n"
"\t -c = CGA snow elimination\n"
"\t -b = BIOS screen writing\n"
"\t -m = force monochrome text attributes",
"Memory allocation error"
};
/* compiler table */
static char *compilers[]=
{ "Microsoft C","Quick C","Turbo C","Zortech C/C++" };
/*---------------------------------------------------------------------------*/
/* help category numbers */
#define H_GLOBAL 1
#define H_WINDOWING 2
#define H_MENUING 3
#define H_LISTPICK 4
#define H_STRPICK 5
#define H_FILEPICK 6
#define H_DATAENTRY 7
#define H_EDITKEYS 8
#define H_DATE 9
#define H_FIRSTNAME 10
#define H_INITIAL 11
#define H_LASTNAME 12
#define H_CITY 13
#define H_STATE 14
#define H_ZIPCODE 15
#define H_COMPILER 16
#define H_AMOUNT 17
#define H_NUMERIC 18
#define H_PULLDOWN 19
#define H_FILE 20
#define H_EDITING 21
#define H_LOAD 22
#define H_SAVE 23
#define H_RENAME 24
#define H_NEW 25
#define H_DIRECTORY 26
#define H_EXECUTE 27
#define H_OSSHELL 28
#define H_QUIT 29
#define H_SCROLL 30
#define H_CHGATTR 31
#define H_CHGBORD 32
#define H_WINTITLE 33
#define H_RESIZE 34
#define H_TEXTLINE 35
#define H_WINMOVE 36
#define H_WINHIDE 37
#define H_ACTIVATE 38
#define H_WINCOPY 39
/*---------------------------------------------------------------------------*/
/* miscellaneous defines */
#define SHORT_DELAY 11
/*---------------------------------------------------------------------------*/
void main(int argc,char *argv[])
{
initialize();
parse_cmd_line(argc,argv);
open_back_wind();
open_stat_wind();
open_titl_wind();
main_menu();
normal_exit();
}
/*---------------------------------------------------------------------------*/
static void activate_demo(void)
{
register int i;
if((w[5]=wopen(9,44,22,78,1,LCYAN|_CYAN,WHITE|_CYAN))==0) error_exit(1);
whelpcat(H_ACTIVATE);
wputs("\n CXL's wactiv() is used to"
"\n activate a window, making"
"\n it available for windowing"
"\n operations.");
press_a_key(6);
/* activate windows 0 thru 5 in order, back to front */
for(i=0;i<6;i++) {
wactiv(w[i]);
short_delay();
}
}
/*---------------------------------------------------------------------------*/
/* this function will add a shadow to the active window */
static void add_shadow(void)
{
wshadow(LGREY|_BLACK);
}
/*---------------------------------------------------------------------------*/
static void chg_attr_demo(void)
{
if((w[1]=wopen(9,35,22,65,0,YELLOW|_BLUE,LCYAN|_BLUE))==0) error_exit(1);
whelpcat(H_CHGATTR);
wputs("\n The wchgattr() function"
"\n allows you to change the"
"\n attribute of the active"
"\n window.");
press_a_key(6);
chg_wind_attr(LMAGENTA|_BLUE ,WHITE|_GREEN);
chg_wind_attr(LGREEN|_LGREY ,LMAGENTA|_RED);
chg_wind_attr(YELLOW|_BROWN ,LCYAN|_BLUE);
chg_wind_attr(YELLOW|_MAGENTA,YELLOW|_MAGENTA);
chg_wind_attr(LRED|_MAGENTA ,WHITE|_MAGENTA);
}
/*---------------------------------------------------------------------------*/
static void chg_bord_demo(void)
{
register int i;
whelpcat(H_CHGBORD);
wtextattr(LGREEN|_MAGENTA);
wputs("\n\n The wborder() function is"
"\n used to change the style"
"\n of the window's border.");
press_a_key(10);
for(i=5;i>=0;i--) {
wborder(i);
short_delay();
}
}
/*---------------------------------------------------------------------------*/
static void chg_wind_attr(int battr,int wattr)
{
wchgattr(battr,wattr);
short_delay();
}
/*---------------------------------------------------------------------------*/
/* this function validates the Date field in the data entry window */
static int check_date(char *buf)
{
int year,month,day;
if(!strblank(buf)) {
parse_date(buf,&month,&day,&year);
/* validate numeric values */
if(month<1 || month>12) {
wperror("Invalid month");
return(1);
}
if(day<1 || day>31) {
wperror("Invalid day");
return(3);
}
}
/* return normally */
return(0);
}
/*---------------------------------------------------------------------------*/
static void close_windows(void)
{
register int i;
for(i=0;i<8;i++) {
wclose();
short_delay();
}
}
/*---------------------------------------------------------------------------*/
/* this function pops open a window and confirms that the user really */
/* wants to quit the demo. If so, it terminates the demo program. */
static void confirm_quit(void)
{
struct _onkey_t *kblist;
kblist=chgonkey(NULL); /* hide any existing hot keys */
if(_mouse&MS_CURS) mshidecur();
if(!wopen(9,26,13,55,0,WHITE|_BROWN,WHITE|_BROWN)) error_exit(1);
add_shadow();
wputs("\n Quit demo, are you sure? \033A\156Y\b");
clearkeys();
showcur();
if(wgetchf("YN",'Y')=='Y') normal_exit();
wclose();
hidecur();
if(_mouse&MS_CURS) msshowcur();
chgonkey(kblist); /* restore any hidden hot keys */
}
/*---------------------------------------------------------------------------*/
static void copy_demo(void)
{
whelpcat(H_WINCOPY);
wtextattr(LCYAN|_CYAN);
wputs("\n\n The wcopy() function is used"
"\n to copy the active window.");
press_a_key(9);
if(!wcopy(1,1)) error_exit(1);
short_delay();
if(!wcopy(3,40)) error_exit(1);
short_delay();
short_delay();
}
/*---------------------------------------------------------------------------*/
static void cxlinfo(void)
{
if(!wopen(4,6,20,72,0,LMAGENTA|_RED,LMAGENTA|_RED)) error_exit(1);
add_shadow();
wcenters(1,LCYAN|_RED,"CXL Version 5.2");
wcenters(2,LCYAN|_RED,"Written by Mike Smedley");
wcenters(3,LCYAN|_RED,"Copyright (c) 1987-1990 All Rights Reserved");
wgotoxy(5,0);
wputs(" CXL is a User-Supported C function library that supports\n"
" Microsoft C, QuickC, Turbo C, and Zortech C/C++. There \n"
" are over 260 functions available for your use. \n"
" When you register you get the remaining memory models\n"
" supported by your compiler and the full source code!\n"
" CXL's routines are written in 99% well-documented,\n"
" easy-to-modify C code. See documentation for details.\n\n");
press_a_key(13);
wclose();
move_bar_down();
}
/*---------------------------------------------------------------------------*/
static void datademo(void)
{
register int ch,mode=0;
unsigned key;
if(!wopen(2,8,20,70,1,LCYAN|_BLUE,LCYAN|_BLUE)) error_exit(1);
add_shadow();
wtitle("[ CXL Order Form ]",TLEFT,LCYAN|_BLUE);
wmessage(" [F10]=Finished ",BT_BORD, 5,LCYAN|_BLUE);
wmessage(" [Esc]=Abort " ,BT_BORD,45,LCYAN|_BLUE);
whelpushc(H_EDITKEYS);
do {
/* Mark beginning of form. */
winpbeg(LGREEN|_LGREY,WHITE|_LGREY);
/* Display prompts and define fields. */
wprints( 1, 3,WHITE|_BLUE,"Date");
winpdef( 1,16,date,"<01>#'/'<0123>#'/'<89>#",0,mode,check_date,H_DATE);
winpfba(NULL,display_date);
wprints( 3, 3,WHITE|_BLUE,"First Name");
winpdef(3,16,firstname,"MMMMMMMMMMMMMMM",0,mode,NULL,H_FIRSTNAME);
wprints( 3,37,WHITE|_BLUE,"Initial");
winpdef( 3,47,initial,"U'.'",0,mode,NULL,H_INITIAL);
wprints( 5, 3,WHITE|_BLUE,"Last Name");
winpdef( 5,16,lastname,"MMMMMMMMMMMMMMMMMMMMMMMMM",0,mode,NULL
,H_LASTNAME);
wprints( 7, 3,WHITE|_BLUE,"Address");
winpdef( 7,16,address,"****************************************",'M'
,mode,NULL,0);
wprints( 9, 3,WHITE|_BLUE,"City");
winpdef( 9,16,city,"MMMMMMMMMMMMMMMMMMMM",0,mode,NULL,H_CITY);
wprints( 9,41,WHITE|_BLUE,"State");
winpdef( 9,50,state,"UU",0,mode,NULL,H_STATE);
wprints(11, 3,WHITE|_BLUE,"Zip Code");
winpdef(11,16,zipcode,"#####'-'%%%%",0,mode,NULL,H_ZIPCODE);
wprints(11,31,WHITE|_BLUE,"Phone");
winpdef(11,40,phone,"'('###') '###'-'####",0,mode,NULL,0);
wprints(13, 3,WHITE|_BLUE,"Compiler");
winpdef(13,16,compiler,"***************",'M',mode,NULL,H_COMPILER);
winpfba(pick_compiler,NULL);
wprints(13,37,WHITE|_BLUE,"Amount");
winpdef(13,46,amtenc,"'$'99999.99",'9',mode,NULL,H_AMOUNT);
wprints(15, 3,WHITE|_BLUE,"Comments");
winpdef(15,16,comments,"****************************************",0
,mode,NULL,0);
/* Define alternate keyboard get function. */
winpkey(get_key,&key);
/* Mark end of form and process it. If [Esc] was pressed, */
/* then don't bother with the confirmation message. */
if(winpread()) break;
/* Test to see if [F10] was pressed. If */
/* so, don't display confirmation message. */
if(key==0x4400) break;
/* Display confirmation message. */
if(!wopen(9,24,13,57,0,WHITE|_CYAN,WHITE|_CYAN)) error_exit(1);
add_shadow();
wputs("\n Is this information correct? \033A\076Y\b");
clearkeys();
ch=wgetchf("YN",'Y');
wclose();
/* Change field mode to "update". */
mode=1;
} while(ch!='Y');
whelpopc();
line_inp_demo();
wclose();
hidecur();
move_bar_down();
}
/*---------------------------------------------------------------------------*/
/* this function displays a quick 'n' dirty directory of current path */
static void directory(void)
{
static int busy=NO;
char filespec[41],file1[13],file2[13];
int i,done,lines,files;
struct ffblk ffblk;
if(busy) return; else busy=YES; /* avoid recursion */
strcpy(filespec,"*.*");
if(_mouse) mshidecur();
showcur();
if(!wopen(4,14,20,59,0,LRED|_MAGENTA,LCYAN|_BLUE)) error_exit(1);
wtitle("[ Directory ]",TCENTER,LRED|_MAGENTA);
if(!wopen(6,6,8,49,0,LMAGENTA|_RED,LMAGENTA|_RED)) error_exit(1);
wtitle("[ Filespec ]",TCENTER,LMAGENTA|_RED);
winpbeg(BLUE|_LGREY,BLUE|_LGREY);
winpdef(0,1,filespec,"WWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW",'U',2
,NULL,H_EDITKEYS);
i=winpread();
wclose();
if(!i) {
wclear();
wtextattr(LCYAN|_BLUE);
lines=files=0;
done=find_first(filespec,&ffblk);
for(;;) {
if(done) break;
files++;
strcpy(file1,ffblk.ff_name);
if(!done) done=find_next(&ffblk);
strcpy(file2,ffblk.ff_name);
if(done)
file2[0]='\0';
else {
files++;
done=find_next(&ffblk);
}
if(done)
ffblk.ff_name[0]='\0';
else
files++;
wprintf(" %-15s%-15s%s\n",file1,file2,ffblk.ff_name);
lines++;
if(lines>=14) {
wtextattr(LGREEN|_BLUE);
wprintf(" Press a key to continue....");
wtextattr(LCYAN|_BLUE);
i=waitkey();
wprintf("\r");
if(i==ESC) break;
lines=0;
}
if(!done) done=find_next(&ffblk);
}
wtextattr(LGREEN|_BLUE);
wprintf(" Files found: %d Press a key....",files);
waitkey();
}
hidecur();
wclose();
if(_mouse) msshowcur();
busy=NO;
}
/*---------------------------------------------------------------------------*/
/* this function displays the literal equivalent of the MMDDYY */
/* date that the user entered into the Date field. It is */
/* called immediately after the user leaves the Date field. */
static void display_date(void)
{
struct _field_t *field;
int month,day,year;
/* find address of Date field's record */
if((field=winpffind(1,16))==NULL) error_exit(1);
/* set cursor and clear to end of window's line */
hidecur();
wgotoxy(1,37);
wclreol();
/* don't display date string if Date field is empty */
if(!strblank(field->buf)) {
/* parse string date into numeric values */
parse_date(field->buf,&month,&day,&year);
/* display date */
wprintf("%s %d, %d",months[month-1],day,year);
}
showcur();
}
/*---------------------------------------------------------------------------*/
/* this function is called by the pull-down demo for a prompt */
static void disp_sure_msg(void)
{
wprints(0,2,WHITE|_BLUE,"Are you sure?");
}
/*---------------------------------------------------------------------------*/
static void display_title(int tpos)
{
wtitle("[ My Title ]",tpos,LCYAN|_GREEN);
short_delay();
}
/*---------------------------------------------------------------------------*/
/* this function is used as a dummy function for */
/* several menu items in the pull-down demo */
static void do_nothing(void)
{
}
/*---------------------------------------------------------------------------*/
/* this function handles abnormal termination. If it is passed an */
/* error code of 1, then it is a windowing system error. Otherwise */
/* the error message is looked up in the error message table. */
static void error_exit(int errnum)
{
if(errnum) {
printf("\n%s\n",(errnum==1)?werrmsg():error_text[errnum]);
exit(errnum);
}
}
/*---------------------------------------------------------------------------*/
/* this function is used by the pull-down demo. */
/* It is used to execute a DOS command. */
static void execute(void)
{
static int busy=NO;
char command[61];
int *scrn;
if(busy) return; else busy=YES; /* avoid recursion */
showcur();
if(_mouse) mshidecur();
if(!wopen(8,7,10,70,0,LMAGENTA|_RED,LMAGENTA|_RED)) error_exit(1);
wtitle("[ Execute DOS Command ]",TCENTER,LMAGENTA|_RED);
winpbeg(BLUE|_LGREY,BLUE|_LGREY);
winpdef(0,1,command,"****************************************"
"********************",0,0,NULL,H_EDITKEYS);
if(!winpread()) {
if((scrn=ssave())==NULL) error_exit(3);
cclrscrn(LGREY|_BLACK);
system(command);
printf("\nPress any key to continue....");
waitkey();
srestore(scrn);
}
hidecur();
if(_mouse) msshowcur();
wclose();
busy=NO;
}
/*---------------------------------------------------------------------------*/
static int find_first(char *filespec,struct ffblk *ffblk)
{
register int done;
#if defined(__ZTC__)
struct ffblk *pffblk;
if((pffblk=findfirst(filespec,0))==NULL)
done=YES;
else {
*ffblk=*pffblk;
done=NO;
}
#else
done=findfirst(filespec,ffblk,0);
#endif
return(done);
}
/*---------------------------------------------------------------------------*/
static int find_next(struct ffblk *ffblk)
{
register int done;
#if defined(__ZTC__)
struct ffblk *pffblk;
pffblk=findnext();
if(pffblk==NULL)
done=YES;
else {
done=NO;
*ffblk=*pffblk;
}
#else
done=findnext(ffblk);
#endif
return(done);
}
/*---------------------------------------------------------------------------*/
/* This function serves as an alternate get key function for the */
/* data entry demo. In this example, I do a normal keyboard */
/* get, but if the key is [F10], I want to exit the form. The */
/* purpose of this is to demonstrate how to extend winpread(). */
unsigned get_key(int *done)
{
unsigned int xch;
xch=getxch();
*done=(xch==0x4400); /* [F10] */
return(xch);
}
/*---------------------------------------------------------------------------*/
static void hide_demo(void)
{
register int i;
whelpcat(H_WINHIDE);
wtextattr(LCYAN|_BROWN);
wputs("\n\n The whide() and wunhide()"
"\n functions are used to hide"
"\n and unhide windows.");
press_a_key(9);
/* hide all windows, front to back */
for(i=0;i<5;i++) {
if(whide()) error_exit(1);
short_delay();
}
/* unhide most recently hidden first */
for(i=0;i<5;i++) {
if(wunhide(0)) error_exit(1);
short_delay();
}
}
/*---------------------------------------------------------------------------*/
static void horz_line(int wrow,int wcol,int count,int attr)
{
whline(wrow,wcol,count,3,attr);
short_delay();
}
/*---------------------------------------------------------------------------*/
/* this function initializes CXL's video, mouse, keyboard, and help systems */
static void initialize(void)
{
/* initialize the CXL video system and save current screen info */
videoinit();
readcur(&crow,&ccol);
if((savescrn=ssave())==NULL) error_exit(3);
/* if mouse exists, turn on full mouse support */
if(msinit()) {
mssupport(MS_FULL);
msgotoxy(12,49);
}
/* attach [Alt-X] to the confirm_quit() function */
setonkey(0x2d00,confirm_quit,0);
/* initialize help system, help key = [F1] */
whelpdef("CXLDEMO.HLP",0x3b00,YELLOW|_RED,LRED|_RED,WHITE|_RED,RED|_LGREY
,pre_help);
}
/*---------------------------------------------------------------------------*/
static void line_inp_demo(void)
{
if(!wopen(5,21,15,58,3,LGREEN|_MAGENTA,LGREEN|_MAGENTA)) error_exit(1);
wtitle("[ Single-Line Input ]",TCENTER,LGREEN|_MAGENTA);
whelpcat(H_DATAENTRY);
add_shadow();
restore_cursor();
if(winputsf(phone,"'\n\n Phone Number? '!R--!"
"'('!+!###!-!') '!+!###!-!'-'!+!####")) confirm_quit();
restore_cursor();
if(winputsf(ssan,"'\n\n Soc Sec Number? '!R-!"
"<01234567>##!-!'-'!+!##!-!'-'!+!####")) confirm_quit();
restore_cursor();
if(winputsf(date,"\"\n\n Today's Date? \"!R-!"
"<01>#!-!'/'!+!<0123>#!-!'/'!+!'19'<89>#")) confirm_quit();
wclose();
}
/*---------------------------------------------------------------------------*/
static void main_menu(void)
{
/* push global help category onto help stack, so when */
/* [F1] is pressed while selection bar is on an item */
/* without help, the global help category will be used. */
whelpushc(H_GLOBAL);
/* define and process the main menu */
wmenubeg(9,27,16,53,0,LBLUE|_BLUE,LBLUE|_BLUE,pre_menu1);
wmenuitem(0,0,"Windowing" ,'W',1,0,windemo ,0,H_WINDOWING);
wmenuitem(1,0,"Menuing" ,'M',2,0,menudemo,0,H_MENUING);
wmenuitem(2,0,"List picking",'L',3,0,pickdemo,0,H_LISTPICK);
wmenuitem(3,0,"Data entry" ,'D',4,0,datademo,0,H_DATAENTRY);
wmenuitem(4,0,"Information" ,'I',5,0,cxlinfo ,0,0);
wmenuitem(5,0,"Exit demo" ,'E',6,0,NULL ,0,0);
wmenuend(1,M_VERT,25,6,LCYAN|_BLUE,WHITE|_BLUE,0,BLUE|_LGREY);
if(wmenuget()==-1) if(_winfo.errno>W_ESCPRESS) error_exit(1);
/* pop the global help category off of the stack, and into the void */
whelpopc();
}
/*---------------------------------------------------------------------------*/
static void menudemo(void)
{
pulldown_demo();
move_bar_down();
}
/*---------------------------------------------------------------------------*/
/* This function is used to move the selection bar of the Main Menu */
/* down to the next menu item. It does this by fetching the address */
/* of the current menu, then setting the current tagid to the tagid */
/* of the next menu item. If I had not numbered the menu items' */
/* tagids sequentially, this would not work. */
static void move_bar_down(void)
{
wmenuinext(wmenuicurr()->tagid+1);
}
/*---------------------------------------------------------------------------*/
static void move_demo(void)
{
if((w[4]=wopen(4,2,16,35,2,LGREEN|_BROWN,WHITE|_BROWN))==0) error_exit(1);
whelpcat(H_WINMOVE);
wputs("\n To move the active window,"
"\n the wmove() function is"
"\n used.");
press_a_key(5);
move_window(0,0);
move_window(10,4);
move_window(6,19);
move_window(1,13);
move_window(11,35);
move_window(2,39);
}
/*---------------------------------------------------------------------------*/
static void move_window(int nsrow,int nscol)
{
if(wmove(nsrow,nscol)) error_exit(1);
short_delay();
}
/*---------------------------------------------------------------------------*/
/* this function handles normal termination. The original screen and cursor */
/* coordinates are restored before exiting to DOS with ERRORLEVEL 0. */
static void normal_exit(void)
{
srestore(savescrn);
gotoxy_(crow,ccol);
if(_mouse) mshidecur();
showcur();
exit(0);
}
/*---------------------------------------------------------------------------*/
static void open_back_wind(void)
{
register int i;
if(!wopen(0,0,23,79,5,0,LGREEN|_GREEN)) error_exit(1);
for(i=1;i<320;i++) wprintf("\033F%cCXL ",i);
}
/*---------------------------------------------------------------------------*/
static void open_stat_wind(void)
{
wfillch('\260');
wopen(24,0,24,79,5,0,LGREY|_RED);
wprints( 0, 1,LGREY|_RED,"[F1]=Help");
wcenters(0 ,LGREY|_RED,"Select demonstration to view.");
wrjusts( 0,78,LGREY|_RED,"[Alt-X]=Quit");
wfillch(' ');
}
/*---------------------------------------------------------------------------*/
static void open_titl_wind(void)
{
if(!wopen(1,12,5,67,0,LRED|_MAGENTA,LRED|_MAGENTA)) error_exit(1);
add_shadow();
wcenters(0,WHITE|_MAGENTA,"Welcome to the CXL Demonstration Program!");
wcenters(2,LCYAN|_MAGENTA,"CXL is Copyright (c) 1987-1990 by Mike Smedley");
}
/*---------------------------------------------------------------------------*/
/* this is used by the pull-down demo. It is the */
/* [O]S Shell function under the [F]ile menu */
static void os_shell(void)
{
int *scrn;
showcur();
if(_mouse) mshidecur();
if((scrn=ssave())==NULL) error_exit(3);
cclrscrn(LGREY|_BLACK);
printf("Type EXIT to return....\n");
system("COMMAND");
srestore(scrn);
hidecur();
if(_mouse) msshowcur();
}
/*---------------------------------------------------------------------------*/
/* this function parses the command line for valid invocation switches. If */
/* any valid switches are found, the appropriate video variable will be */
/* set. If any invalid parameters are found, a syntax message is displayed. */
static void parse_cmd_line(int argc,char *argv[])
{
register int i,j;
char *p;
for(i=1;i<argc;i++) {
p=argv[i];
if(*p=='-'||*p=='/') {
for(j=1;*(p+j);j++) {
switch(tolower(*(p+j))) {
case 'c':
setvparam(VP_CGA);
break;
case 'b':
setvparam(VP_BIOS);
break;
case 'm':
setvparam(VP_MONO);
break;
default:
error_exit(2);
}
}
}
else
error_exit(2);
}
}
/*---------------------------------------------------------------------------*/
/* this function parses a MMDDYY date string into separate numeric values */
static void parse_date(char *buf,int *month,int *day,int *year)
{
char date[7];
strcpy(date,buf);
*year=1900+atoi(date+4);
*(date+4)='\0';
*day=atoi(date+2);
*(date+2)='\0';
*month=atoi(date);
}
/*---------------------------------------------------------------------------*/
static void pick_compiler(void)
{
register int subscr,i;
whelpush();
wmenubeg(9,22,14,38,0,LMAGENTA|_MAGENTA,LMAGENTA|_MAGENTA,pre_menu2);
for(i=0;i<4;i++) wmenuitem(i,0,compilers[i],*compilers[i],i,0,NULL,0,0);
wmenuend(0,M_VERT,15,1,LMAGENTA|_MAGENTA,LCYAN|_MAGENTA,0,BLUE|_LGREY);
if((subscr=wmenuget())==-1) if(_winfo.errno>W_ESCPRESS) error_exit(1);
kbput(0x4700); /* [Home] */
if(subscr!=-1) {
kbputs(compilers[subscr]);
kbput(0x1615); /* [Ctrl-U] */
}
kbput(0x1c0d); /* [Enter] */
whelpop();
}
/*---------------------------------------------------------------------------*/
/* this function demonstrates the string picker, the file */
/* picker, and the in-place string selector functions. */
static void pickdemo(void)
{
register int *scrn;
if((scrn=ssave())==NULL) error_exit(3);
cclrscrn(LGREY|_BLUE);
if(!wopen(4,11,14,68,3,LMAGENTA|_RED,LRED|_MAGENTA)) error_exit(1);
add_shadow();
wprintf("\033R\001\033C\003Select a month =>\033R\001\033C\003");
whelpcat(H_STRPICK);
you_selected(months[wpickstr(0,32,5,-1,0,LGREEN|_RED,LCYAN|_RED,RED|_LGREY
,months,0,pre_pick1)]);
wprintf("\033R\003\033C\003Now, select a file.\033R\003\033C\003");
whelpcat(H_FILEPICK);
you_selected(wpickfile(10,9,20,66,0,LCYAN|_RED,LGREY|_RED,RED|_LGREY
,1,"*.*",add_shadow));
wprintf("\033R\005\033C\003Select a printer port:\033R\005\033C\003");
showcur();
you_selected(prn_ports[wselstr(5,27,LMAGENTA|_MAGENTA,prn_ports,0)]);
hidecur();
wclose();
srestore(scrn);
move_bar_down();
}
/*---------------------------------------------------------------------------*/
static void popup_demo(void)
{
whelpushc(H_PULLDOWN);
wmenubeg(7,15,10,65,0,LRED,LCYAN|_BLUE,NULL);
wmenuitem(0, 0,"Add", 'A',55,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Create a new record");
wmenuitem(0, 8,"Delete",'D',56,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Delete an existing record");
wmenuitem(0,19,"Print", 'P',57,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Print hardcopy of existing record");
wmenuitem(0,28,"Show", 'S',58,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Display an existing record on screen");
wmenuitem(0,36,"Update",'U',59,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Modify an existing record");
wmenuitem(0,45,"Quit", 'Q',60,0,NULL,0,0);
wmenuitxt(1,0,LGREEN|_BLUE,"Quit and return to pull-down menu");
wmenuend(55,M_HORZ,0,0,LMAGENTA|_BLUE,WHITE|_BLUE,0,YELLOW|_LGREY);
wmenuget();
whelpopc();
}
/*---------------------------------------------------------------------------*/
static void pre_help(void)
{
add_shadow();
setonkey(0x2d00,confirm_quit,0);
}
/*---------------------------------------------------------------------------*/
/* this function is called during the setup of the main menu. It is */
/* called by wmenuget() right after the main menu's window is opened. */
static void pre_menu1(void)
{
hidecur();
add_shadow();
}
/*---------------------------------------------------------------------------*/
/* this function is called during the Data Entry demo when */
/* the user enters the Compiler field. It is called by */
/* wmenuget() after the compiler choice menu is opened. */
static void pre_menu2(void)
{
add_shadow();
if(_mouse) msgotoxy(11,34);
hidecur();
}
/*---------------------------------------------------------------------------*/
/* this function is called during the List Picking demo. It is called */
/* by wpickstr() right after the string picker's window is opened. */
static void pre_pick1(void)
{
wmessage("┐ ┌",BT_BORD,4,LGREEN|_RED);
add_shadow();
}
/*---------------------------------------------------------------------------*/
/* this function displays a pause message then pauses for a keypress */
static void press_a_key(int wrow)
{
register int attr;
attr=(BLINK|YELLOW)|((_winfo.active->wattr>>4)<<4);
wcenters(wrow,attr,"Press a key");
hidecur();
if(waitkey()==ESC) confirm_quit();
wcenters(wrow,attr," ");
}
/*---------------------------------------------------------------------------*/
static void pulldown_demo(void)
{
int selection;
whelpushc(H_PULLDOWN);
if(!wopen(0,0,24,79,0,CYAN,CYAN)) error_exit(1);
whline(1,0,78,0,CYAN);
setkbloop(update_clock);
wgotoxy(2,0);
wtextattr(YELLOW);
wputs("This is a sample editor interface to demonstrate how CXL's "
"menuing functions\n");
wputs("can be used to create a pull-down menu system. Use the arr"
"ow keys to move\n");
wputs("selection bar around and use the [Esc] key to back up to th"
"e previous menu.\n");
wputs("Pressing [F1] will bring up context-sensitive help. Select"
" [Q]uit from any\n");
wputs("menu to exit the pull-down demo. Be sure to try some of th"
"e menu options in\n");
wputs("the pull-down menus.");
if(_mouse)
wputs(" Since you have a mouse, you can use it to "
"move around\nand select options!");
/* define menu structure */
wmenubeg(1,1,1,78,5,CYAN,CYAN|_BLUE,NULL);
wmenuitem(0,2,"File",'F',19,M_HASPD,NULL,0,H_FILE);
wmenubeg(2,1,11,17,0,LGREY|_BLUE,_BLUE,NULL);
wmenuitem(0,0,"Load" ,'L',20,0,do_nothing,0,H_LOAD);
wmenuitem(1,0,"Save" ,'S',21,0,do_nothing,0,H_SAVE);
wmenuitem(2,0,"Rename" ,'R',22,0,do_nothing,0,H_RENAME);
wmenuitem(3,0,"New" ,'N',23,0,do_nothing,0,H_NEW);
wmenuitem(4,0,"Directory F5",'D',24,0,directory ,0x3f00,H_DIRECTORY);
wmenuitem(5,0,"Execute F6",'E',25,0,execute ,0x4000,H_EXECUTE);
wmenuitem(6,0,"OS Shell F7",'O',26,M_CLOSB,os_shell,0x4100,H_OSSHELL);
wmenuitem(7,0,"Quit" ,'Q',27,M_CLALL,NULL,0,H_QUIT);
wmenuiba(quit_window,quit_window);
wmenuend(20,M_PD|M_SAVE,15,1,YELLOW|_BLUE,LCYAN|_BLUE,0
,YELLOW|_MAGENTA);
wmenuitem(0,15,"Editing",'E',28,M_HASPD,NULL,0,H_EDITING);
wmenubeg(2,14,10,28,0,LGREY|_BLUE,_BLUE,NULL);
wmenuitem(0,0,"Cut" ,'C',29,0 ,do_nothing ,0,0);
wmenuitem(1,0,"Paste" ,'P',30,M_NOSEL,do_nothing ,0,0);
wmenuitem(2,0,"cOpy" ,'O',31,M_NOSEL,do_nothing ,0,0);
wmenuitem(3,0,"block Begin",'B',32,0 ,toggle_block,0,0);
wmenuitem(4,0,"block End" ,'E',33,M_NOSEL,toggle_block,0,0);
wmenuitem(5,0,"Insert line",'I',34,0 ,do_nothing ,0,0);
wmenuitem(6,0,"Delete line",'D',35,0 ,do_nothing ,0,0);
wmenuend(29,M_PD|M_SAVE,13,1,YELLOW|_BLUE,LCYAN|_BLUE,CYAN|_BLUE
,YELLOW|_MAGENTA);
wmenuitem(0,31,"Defaults",'D',36,M_HASPD,NULL,0,0);
wmenubeg(2,30,13,52,0,LGREY|_BLUE,_BLUE,setup_menu);
wmenuitem(0,0,"Left margin 0",'L',37,0,do_nothing,0,0);
wmenuitem(1,0,"Right margin 72",'R',38,0,r_margin ,0,0);
wmenuitem(2,0,"Tab width 4",'T',39,0,do_nothing,0,0);
wmenuitem(4,0,"tab eXpansion yes",'X',40,0,toggle_yn ,0,0);
wmenuitem(5,0,"Insert mode yes",'I',41,0,toggle_yn ,0,0);
wmenuitem(6,0,"iNdent mode yes",'N',42,0,toggle_yn ,0,0);
wmenuitem(7,0,"Word wrap mode no",'W',43,0,toggle_yn ,0,0);
wmenuitem(9,0,"Save defaults" ,'S',44,0,do_nothing,0,0);
wmenuend(37,M_PD|M_SAVE,21,1,YELLOW|_BLUE,LCYAN|_BLUE,0
,YELLOW|_MAGENTA);
wmenuitem(0,47,"Run" ,'R',45,0 ,popup_demo,0,0);
wmenuitem(0,59,"Options",'O',46,M_HASPD,NULL,0,0);
wmenubeg(2,56,8,77,0,LGREY|_BLUE,_BLUE,NULL);
wmenuitem(0,0,"screen siZe 43",'Z',47,0,do_nothing,0,0);
wmenuitem(1,0,"Backup files yes",'B',48,0,toggle_yn ,0,0);
wmenuitem(2,0,"bOxed display no",'O',49,0,toggle_yn ,0,0);
wmenuitem(3,0,"Load options" ,'L',50,0,do_nothing,0,0);
wmenuitem(4,0,"Save options" ,'S',51,0,do_nothing,0,0);
wmenuend(47,M_PD|M_SAVE,20,1,YELLOW|_BLUE,LCYAN|_BLUE,0
,YELLOW|_MAGENTA);
wmenuitem(0,73,"Quit",'Q',52,M_HASPD,NULL,0,0);
wmenuiba(quit_window,quit_window);
wmenubeg(2,60,7,78,0,LGREY|_BLUE,_BLUE,disp_sure_msg);
wmenuitem(2,0,"No" ,'N',53,M_CLOSE,NULL,0,0);
wmenuitem(3,0,"Yes",'Y',54,M_CLALL,NULL,0,0);
wmenuend(53,M_PD,17,7,YELLOW|_BLUE,LCYAN|_BLUE,WHITE|_BLUE
,YELLOW|_MAGENTA);
wmenuend(19,M_HORZ,0,0,YELLOW|_BLUE,LCYAN|_BLUE,0,YELLOW|_MAGENTA);
/* process the menu */
selection=wmenuget();
if(selection==-1&&_winfo.errno>W_ESCPRESS) error_exit(1);
wclose();
setkbloop(NULL);
whelpopc();
}
/*---------------------------------------------------------------------------*/
/* this function is called by the pull-down menu demo anytime */
/* the selection bar moves on or off the [Q]uit menu items. */
static void quit_window(void)
{
static WINDOW handle=0;
if(handle) {
wactiv(handle);
wclose();
handle=0;
}
else {
handle=wopen(14,41,17,70,0,YELLOW|_RED,WHITE|_RED);
wputs(" Quit takes you back to the\n demo program's main menu.");
}
}
/*---------------------------------------------------------------------------*/
/* this function handles the setting of the [R]ight */
/* margin setting under the [D]efault pull-down menu. */
static void r_margin(void)
{
winpbeg(WHITE|_CYAN,WHITE|_CYAN);
winpdef(1,17,wmenuicurr()->str+16,"%%#",'9',1,NULL,0);
winpread();
hidecur();
wmenuicurr()->redisp=YES;
}
/*---------------------------------------------------------------------------*/
static void resize_demo(void)
{
whelpcat(H_RESIZE);
wtextattr(LGREEN|_GREEN);
wputs("\n\n\n The wsize() function"
"\n allows you to resize"
"\n the active window.");
press_a_key(10);
size_window(19,60);
size_window(19,75);
size_window(24,75);
size_window(24,60);
size_window(24,45);
size_window(19,45);
}
/*---------------------------------------------------------------------------*/
static void restore_cursor(void)
{
wtextattr(WHITE|_MAGENTA);
showcur();
}
/*---------------------------------------------------------------------------*/
static void scroll_demo(void)
{
register int i,j;
if((w[0]=wopen(1,1,11,41,2,LMAGENTA|_RED,LCYAN|_RED))==0) error_exit(1);
whelpcat(H_SCROLL);
wprintf("\n CXL's window TTY output functions"
"\n such as wputs() and wprintf() allow"
"\n scrolling and ANSI-like Escape code"
"\n sequences from inside of windows.");
press_a_key(6);
wgotoxy(8,0);
for(i=0;i<10;i++) {
for(j=DGREY;j<=WHITE;j++) {
wprintf("\033F%cCXL ",j);
delay_(1);
}
}
}
/*---------------------------------------------------------------------------*/
/* this function sets up the [D]efaults menu for the pull-down demo */
static void setup_menu(void)
{
whline(3,0,21,0,LGREY|_BLUE);
whline(8,0,21,0,LGREY|_BLUE);
}
/*---------------------------------------------------------------------------*/
static void short_delay(void)
{
delay_(SHORT_DELAY);
}
/*---------------------------------------------------------------------------*/
static void size_window(int nerow,int necol)
{
wsize(nerow,necol);
short_delay();
}
/*---------------------------------------------------------------------------*/
static void text_line_demo(void)
{
if((w[3]=wopen(10,3,23,41,3,YELLOW|_BLUE,LMAGENTA|_BLUE))==0)
error_exit(1);
whelpcat(H_TEXTLINE);
wputs("\n The whline() & wvline() functions"
"\n are used for drawing \"smart\" text"
"\n lines which will even make their "
"\n own corners and intersections! ");
press_a_key(6);
horz_line(6,6,24,LCYAN|_BLUE);
vert_line(6,6,4,LCYAN|_BLUE);
horz_line(10,6,24,LCYAN|_BLUE);
vert_line(6,30,5,LRED|_BLUE);
vert_line(6,18,5,LRED|_BLUE);
horz_line(7,6,25,LRED|_BLUE);
horz_line(9,6,25,LGREEN|_BLUE);
vert_line(6,11,5,LGREEN|_BLUE);
vert_line(6,23,5,LGREEN|_BLUE);
horz_line(8,6,25,LMAGENTA|_BLUE);
}
/*---------------------------------------------------------------------------*/
static void title_demo(void)
{
if((w[2]=wopen(5,20,19,45,3,LCYAN|_GREEN,WHITE|_GREEN))==0) error_exit(1);
whelpcat(H_WINTITLE);
wputs("\n The wtitle() function"
"\n allows you to give a"
"\n window a title.");
press_a_key(5);
display_title(TLEFT);
display_title(TRIGHT);
display_title(TCENTER);
}
/*---------------------------------------------------------------------------*/
/* this function toggles "block marking" on and off */
/* in the sample editor of the pulldown menu demo */
static void toggle_block(void)
{
static int block=OFF;
if(block) {
block=OFF;
wmenuienab(32);
wmenuidsab(33);
wmenuinext(32);
}
else {
block=ON;
wmenuidsab(32);
wmenuienab(33);
wmenuinext(33);
}
if(wopen(11,30,15,49,0,LRED|_MAGENTA,WHITE|_MAGENTA)) {
wprintf("\n Block is now o%s",block?"n":"ff");
delay_(10);
wclose();
}
}
/*---------------------------------------------------------------------------*/
/* This function toggles the yes/no status of some pull-down menu items. */
/* This is to show you can modify the menu item's string and redisplay it. */
/* This is done by getting the address of the current menu item's struct, */
/* then modifying the string pointed to by the str element. The redisp */
/* flag is set so that when you return to the menu, the screen will be */
/* automatically updated. */
static void toggle_yn(void)
{
struct _item_t *citem;
char *str,*yn;
citem=wmenuicurr();
str=citem->str;
yn=str+strlen(str)-3;
strcpy(yn,strcmp(yn,"yes")?"yes":" no");
citem->redisp=1;
}
/*---------------------------------------------------------------------------*/
/* this function updates the on-screen clock in the pull-down demo. */
static void update_clock(void)
{
prints(0,70,LGREEN,systime(1));
}
/*---------------------------------------------------------------------------*/
static void vert_line(int wrow,int wcol,int count,int attr)
{
wvline(wrow,wcol,count,3,attr);
short_delay();
}
/*---------------------------------------------------------------------------*/
/* this function is used by the List Picking demo to display a selected */
/* string, or display an error message if an error occurred. It also */
/* prompts the user for a keypress 2 lines below the string/error message. */
static void you_selected(char *str)
{
int wrow,wcol;
if(_winfo.errno)
wprintf("\033EL%s",werrmsg());
else
wprintf("\033ELYou selected: \033F\005%s\033F\004",str);
whelpcat(H_LISTPICK);
wreadcur(&wrow,&wcol);
press_a_key(wrow+2);
}
/*---------------------------------------------------------------------------*/
static void windemo(void)
{
int *scrn;
if((scrn=ssave())==NULL) error_exit(3);
cclrscrn(LGREY|_BLACK);
scroll_demo();
chg_attr_demo();
chg_bord_demo();
title_demo();
resize_demo();
text_line_demo();
move_demo();
hide_demo();
activate_demo();
copy_demo();
close_windows();
srestore(scrn);
clearkeys();
move_bar_down();
}